﻿using System.Collections.Generic;
using Wedn.Core.Entity;

namespace Wedn.Interface.DAL
{
    /// <summary>
    /// 链接表操作类接口
    /// </summary>
    public interface ILink
    {
        #region 增加记录
        /// <summary>
        /// 向链接表中插入一行数据, 返回执行结果受影响行数
        /// </summary>
        /// <param name="link">要插入的对象</param>
        /// <returns>执行结果受影响行数</returns>
        int Insert(Link link);
        #endregion

        #region 删除记录

        #region 删除一条记录
        /// <summary>
        /// 根据链接ID删除链接表对应的一条记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除记录的链接ID</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int id);
        #endregion

        #region 删除多条记录
        /// <summary>
        /// 根据链接ID数组删除链接表对应的多条记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除记录的链接ID数组</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int[] ids);
        #endregion

        #endregion

        #region 更新记录

        #region 更新完整对象
        /// <summary>
        /// 更新一个完整链接对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="link">要更新的对象</param>
        /// <returns>执行结果受影响行数</returns> 
        int UpdateLink(Link link);
        #endregion

        #region 更新常用字段

        /// <summary>
        /// 根据链接ID数组批量更新多个链接的父ID, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">链接ID数组</param>
        /// <param name="parentId">父ID(忽略则传入-1)</param>
        /// <param name="visible">更新的是否可见</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateParentId(int[] ids, int parentId, bool visible);

        #endregion

        #endregion

        #region 选取记录

        #region 选取表中主键最大值
        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        int SelectMaxId();
        #endregion

        #region 选取链接总数
        /// <summary>
        /// 选取链接总数
        /// </summary>
        /// <param name="where">选择条件(忽略则传入null或空值)(不能使用参数, 要使用参数化写重载)</param>
        /// <returns>总数</returns>
        int SelectLinksCount(string where);
        #endregion

        #region 选取集合

        #region 选取全部链接
        /// <summary>
        /// 取出当前链接表中的所有链接信息, 返回所有链接信息集合, 如果不存在则返回null
        /// </summary>
        /// <returns>所有链接信息对象集合</returns>
        List<Link> SelectLinkList();
        #endregion

        #region 根据父ID,链接类型和是否启用选取链接对象集合
        /// <summary>
        /// 根据父ID,链接类型和是否启用选取链接对象集合, 返回链接信息对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="parentId">父ID</param>
        /// <param name="type">链接类型(0:blogroll; 1:navigation; 2:footer)</param>
        /// <param name="visible">是否是可用链接</param>
        /// <returns>链接信息对象集合</returns>
        List<Link> SelectLinkList(int parentId, int type, bool visible);
        #endregion

        #region 根据链接类型和是否启用选取链接对象集合
        /// <summary>
        /// 根据链接类型和是否启用选取链接对象集合, 返回链接信息对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="type">链接类型(0:blogroll; 1:navigation; 2:footer)</param>
        /// <param name="visible">是否是可用链接</param>
        /// <returns>链接信息对象集合</returns>
        List<Link> SelectLinkList(int type, bool visible);
        #endregion

        #region 根据检索条件选取链接对象集合
        /// <summary>
        /// 根据检索条件选取链接对象集合, 返回满足条件的链接对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="keyword">关键词(忽略则传入null)</param>
        /// <param name="parentId">父ID(忽略该条件传入-1)</param>
        /// <param name="type">链接类型(0:blogroll; 1:navigation; 2:footer)</param>
        /// <param name="visible">是否是可用链接</param>
        /// <param name="pageSize">文章数目(忽略该条件传入-1)</param>
        /// <param name="pageIndex">页码(取所有者传入-1)</param>
        /// <param name="orderField">排序字段(忽略则传入null)</param>
        /// <param name="order">排序方式(0:降序(desc)|1:升序(asc))(忽略则传入-1)</param>
        /// <param name="recordCount">返回查询到的记录数量</param>
        /// <returns>满足条件的链接对象集合</returns>
        List<Link> SelectLinkList(string keyword, int parentId, int type, bool visible, int pageSize, int pageIndex, string orderField, int order, out int recordCount);
        #endregion

        #endregion

        #region 根据ID选取链接对象
        /// <summary>
        /// 根据ID取出当前链接表中的链接对象, 如果不存在则返回null
        /// </summary>
        /// <param name="id">链接ID</param>
        /// <returns>链接对象</returns>
        Link SelectLink(int id);
        #endregion

        #endregion
    }
}
